package com.jy.datapipeline.importserver.handler;

import cn.hutool.core.util.ObjectUtil;
import com.jy.datapipeline.common.vo.ReturnVo;
import com.jy.datapipeline.importserver.entity.ImportSubtask;
import com.jy.datapipeline.importserver.service.ImportSubTaskService;
import com.jy.datapipeline.importserver.support.MessageSupport;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

/**
 * @类名 ScheduleRetryHandler
 * @描述 TODO
 * @作者 白条君
 * @创建日期 2023/4/25 13:37
 * @版本 1.0
 */
@Slf4j
@Component
public class ScheduleRetryHandler {

    @Resource
    private ImportSubTaskService importSubTaskService;

    @Resource
    private MessageSupport messageSupport;

    @Value("${schedule.fixTryCount}")
    private Integer fixTryCount;

    @SneakyThrows
    public ReturnVo executeRetry(Long id) {
        //获取重试次数
        Integer tryCount = importSubTaskService.getTryCount(id);

        //如果执行次数小于指定次数，就返回失败的子任务到客户端
        if (ObjectUtil.isNotNull(tryCount) && tryCount < fixTryCount) {
            log.info("id为：" + id + "的任务进行重试，当前重试次数为：" + tryCount);

            //更新子任务重试次数
            ImportSubtask importSubTask = new ImportSubtask();
            importSubTask.setId(id);
            importSubTask.setTryCount(tryCount + 1);
            importSubTask.setUpdatetime(new Date());
            //通过乐观锁保证安全
            importSubTaskService.modifySubTask(importSubTask);

            //返回到客户端进行重试
            return messageSupport.returnFailStartSubtasks(id);
        }
        return ReturnVo.ok();
    }
}
